package main

import "fmt"

// 切片重组
func main() {
	//我们已经知道切片创建的时候通常比相关数组小 slice1 := make([]type, start_length, capacity)
	//其中 start_length 作为切片初始长度而 capacity 作为相关数组的长度。
	//这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组

	slice1 := make([]int, 3, 6)        //定义切片，以及最大容量
	slice1 = slice1[0 : len(slice1)+1] //将切片扩展 1 位可以这么做  切片可以反复扩展直到占据整个相关数组

	//如果想增加切片的容量，我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来
	sl_from := []int{1, 2, 3} //创建一个3个大小的切片
	sl_to := make([]int, 10)  //创建一个是个大小的切片
	n := copy(sl_to, sl_from) //将from的元素拷贝到to中 返回拷贝元素的个数
	fmt.Println(n)
	fmt.Println(sl_to)

	sl3 := []int{1, 2, 3}      //定义一个切片
	println(cap(sl3))          //输出最大容量
	sl3 = append(sl3, 4, 5, 6) //在sl3后面追加元素
	println(cap(sl3))          //输出最大容量
	fmt.Println(sl3)

	//定义一个数组
	var arr1 = [5]int{1, 2, 3, 4, 5}
	//定义一个切片
	slice1 = arr1[0:4]         //切片的大小是4个 对应数组中的1234
	fmt.Println(arr1)          //输出12345
	fmt.Println(slice1)        //输出1234
	slice1 = append(slice1, 6) //在切片后追加一个6
	fmt.Println(arr1)          //数组变成了12346
	fmt.Println(slice1)        //切片也是12346 此时切片的长度已经和数组一样了
	slice1 = append(slice1, 7) //长度跟数组的长度一样之后，再尝试追加一个7
	fmt.Println(arr1)          //此时数组的长度不变 元素还是12346
	fmt.Println(slice1)        //此时切片的长度加1 元素为123467
}
